public class MySingletonLink {

    private Node head; // 头结点

    // 未插
    public void insertEnd(String ele) {
        // 判断头结点是否为空
        if (head == null) {
            head = new Node(ele);
            return;
        }

        // 头结点被占用后，只能往后寻找空的节点
        Node current = head; // 从头开始判断
        while (current.next != null) { // 当前节点的不为空说明当前节点中已经存在数据，继续往后找
            current = current.next; // 继续从他的下一个节点开始
        }

        // 找到了一个位置为空就把新元素方到这个位置
        current.next = new Node(ele);
    }

    public void print() {
        Node current = head; // 从头结点开始
        while (current.next != null) { // 当前节点的下一个不为空说明有值
            System.out.println(current.data);
            current = current.next;
        }
        System.out.println(current.data);
    }

    // 头插法:新元素都要插入到头部
    public void insertHead(String ele) {

        // 把元素封装成Node节点对象
        Node newNode = new Node(ele);

        // 头部没有元素，新元素就是头结点
        if (head == null) {
            head = newNode;
            return;
        }

        //  新节点的下一个节点是原来的头结点
        newNode.next = head;

        // 新节点就变成头结点
        head = newNode;
    }

    // 内部类
    class Node {
        private Object data; // 当前节点需要保存的数据

        private Node next; // 当前节点的下一个节点

        public Node(Object data) { // 利用构造器给节点赋值
            this.data = data;
        }
    }
}
